////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxhal3entry.h
/// @brief Dispatch entry points for HAL3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// NOWHINE FILE DC002: Google entry points aren't documented the same way
// NOWHINE FILE GR017: Google uses intrinsics directly
// NOWHINE FILE NC010: Google doesn't follow our camel-casing rules
// NOWHINE FILE NC011: Google calls functions "init"
// NOWHINE FILE CF032: Google allows C-style functions without (VOID)

#ifndef CAMXHAL3ENTRY_H
#define CAMXHAL3ENTRY_H

#include <hardware/camera3.h>

#include "camxentry.h"
#include "camxincs.h"

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Type Definitions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// @brief Define type of the device close function
typedef int (*HwDeviceCloseFunc)(struct hw_device_t *device);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Function Declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetCamera3DeviceOps
///
/// @brief Return the camera3 device ops entry points to the HAL3 Device
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
camera3_device_ops_t *GetCamera3DeviceOps();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetHwDeviceCloseFunc
///
/// @brief Return the camera3 hardware device close entry point to the HAL3 Device
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HwDeviceCloseFunc GetHwDeviceCloseFunc();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// HAL3 Entry Points
///
/// All HAL3 entry points follow the Google definitions at https://source.android.com/devices/halref/camera3_8h_source.html
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// hw_module_methods_t entry points
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int open(
    const struct hw_module_t *pHwModuleAPI,
    const char *pCameraIdAPI,
    struct hw_device_t **ppHwDeviceAPI);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// camera_module_t entry points
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int get_number_of_cameras(void);

int get_camera_info(
    int cameraIdAPI,
    struct camera_info *pCameraInfoAPI);

int set_callbacks(
    const camera_module_callbacks_t *pModuleCbsAPI);

void get_vendor_tag_ops(
    vendor_tag_ops_t *pVendorTagOpsAPI);

int open_legacy(
    const struct hw_module_t *pHwModuleAPI,
    const char *pCameraIdAPI,
    uint32_t halVersionAPI,
    struct hw_device_t **ppHwDeviceAPI);

int set_torch_mode(
    const char *pCameraIdAPI,
    bool enabledAPI);

int init();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// vendor_tag_ops_t entry points
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int get_tag_count(
    const vendor_tag_ops_t *pVendorTagOpsAPI);

void get_all_tags(
    const vendor_tag_ops_t *pVendorTagOpsAPI,
    uint32_t *pTagArrayAPI);

const char *get_section_name(
    const vendor_tag_ops_t *pVendorTagOpsAPI,
    uint32_t tagAPI);

const char *get_tag_name(
    const vendor_tag_ops_t *pVendorTagOpsAPI,
    uint32_t tagAPI);

int get_tag_type(
    const vendor_tag_ops_t *pVendorTagOpsAPI,
    uint32_t tagAPI);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// hw_device_t entry points
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int close(
    struct hw_device_t *pHwDeviceAPI);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// camera3_device_ops_t entry points
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int initialize(
    const struct camera3_device *pCamera3DeviceAPI,
    const camera3_callback_ops_t *pCamera3CbOpsAPI);

int configure_streams(
    const struct camera3_device *pCamera3DeviceAPI,
    camera3_stream_configuration_t *pStreamConfigsAPI);

const camera_metadata_t *construct_default_request_settings(
    const struct camera3_device *pCamera3DeviceAPI,
    int requestTemplateAPI);

int process_capture_request(
    const struct camera3_device *pCamera3DeviceAPI,
    camera3_capture_request_t *pCaptureRequestAPI);

void dump(
    const struct camera3_device *pCamera3DeviceAPI,
    int fdAPI);

int flush(
    const struct camera3_device *pCamera3DeviceAPI);

CAMX_NAMESPACE_END

#endif // CAMXHAL3ENTRY_H
